// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package pprof

import (
	"context"
	"unsafe"
)

// runtime\u expandFinalInlineFrame在runtime/symtab中定义。去
func runtime_expandFinalInlineFrame(stk []uintptr) []uintptr

// runtime_setProfLabel在runtime/proflabel中定义。去
func runtime_setProfLabel(labels unsafe.Pointer)

// runtime_getProfLabel在runtime/proflabel中定义。去
func runtime_getProfLabel() unsafe.Pointer

// SetGoroutineLabels将当前goroutine的标签设置为与ctx匹配。
// 新的goroutine继承了创建它的goroutine的标签。
// 这是一个比Do级别更低的API，如果可能，应该使用它。
func SetGoroutineLabels(ctx context.Context) {
	ctxLabels, _ := ctx.Value(labelContextKey{}).(*labelMap)
	runtime_setProfLabel(unsafe.Pointer(ctxLabels))
}

// 使用父上下文的副本调用f，并将给定的标签添加到父的标签映射中。
// 执行f时生成的Goroutines将继承扩展的标签集。
// 标签中的每一个键/值对都会按照提供的顺序插入标签映射中，覆盖同一个键之前的任何值。
// 将在调用f 
// 期间设置增强标签映射，并在f返回后恢复。
func Do(ctx context.Context, labels LabelSet, f func(context.Context)) {
	defer SetGoroutineLabels(ctx)
	ctx = WithLabels(ctx, labels)
	SetGoroutineLabels(ctx)
	f(ctx)
}
